;(function($) {
    DT.Browser = function(options) {
        var _this  = this;
        var _index = 0;
        
        DT.Window.apply(this, options);
        
        options = $.extend(this.defaults, {
            type             : 'browser',
            desktop          : null,        // 桌面对象，用于承载Browser插件
            taskbar          : null,        // 任务栏对象，Browser创建快捷链接到任务栏用
            tabs             : [],          // 标签对象组
            tabWidth         : 'auto',      // 标签宽度，auto/固定宽度（px）
            closeButtonOnTab : true,        // 是否在标签栏上显示关闭按钮，默认true
            allowCreateTab   : true,        // 是否允许创建新标签，默认true
            defaultTabConfig : {            // 创建标签式默认的配置信息
                title     : 'New Tab',                          // 标签名称
                //url     : DT.pathname + 'blank.htm',          // 标签默认打开的页面
                content   : 'Hello...',
                url     : DT.pathname + 'hello.html',          // 标签默认打开的页面
                openState : true,                               // 打开状态
                reload    : false                               // 是否每次点击标签都刷新
            },
            width            : 600,
            height           : 400
        },  options);

        $.extend(this.handler, {
            newTabButton  : null,          // 用来新建标签的按钮
            tabsContainer : null,          // 标签容器
            currentTab    : null           // 当前标签对象
        });

        var _cf = this._createFrame;
        
        this._createFrame = function() {
            var handler = _this.handler;

            _cf.apply(this, arguments);
            _cf = null;
            
            handler.tabsContainer = $('<div></div>').addClass('dt-browser-tabs-container')
                .insertBefore(handler.work)
                .css({
                    height : DT.TAB_HEIGHT
                });

            // 重置最大化按钮事件
            //handler.maxButton.unbind('click');
            //handler.maxButton.bind('click', this, function(event) {
            //    _this._maxHandler.apply(_this, [function() {alert('hello')}]);
            //    _this._setSize.apply(_this);
            //});

            // 重置最小化按钮事件
            handler.minButton.unbind('click');
            handler.minButton.bind('click', this, function(event) {
                event.stopPropagation();
                _this._minHandler.apply(_this);
            });

            // 重置关闭按钮事件
            handler.closeButton.unbind('click');
            handler.closeButton.bind('click', this, function(event) {
                event.stopPropagation();
                _this._closeHandler.apply(_this);
            });

            return this;
        };

        /**
         * 创建标签
         * @param {Object} config 要创建的标签相关信息。
         * config = {
            title : '标题',
            content : '内容',
            url     : '指向的url，优先于content',
            clickHandler : function() {},    // 点击事件，用户自定义
            closeHandler : function() {},    // 关闭标签事件，用户自定义
            obj          : null,             // 系统自动创建的标签头对象
            iframe       : null,             // 系统自动创建的标签对应的工作区帧
         }
         */
        this._createTab = function(config /* Object */) {
            var handler       = _this.handler,
                tabsContainer = handler.tabsContainer,
                id            = 'dt_browser_tab_' + _index;

            handler.work.children().length == 0 && this.setContent('');
            tabsContainer.children().length == 0 && this._createNewTabButton();

            config.obj = $('<div></div>').addClass('dt-browser-tab')
                .attr({
                    id : id
                })
                .insertBefore(handler.newTabButton)
                .click(function() {
                    _this._swapTabs(this.id);
                });

            // 创建标题对象
            $('<div></div>').addClass('dt-browser-tab-title')
                .appendTo(config.obj)
                .html(config.title);

            // 创建标签的关闭按钮
            $('<div></div>').addClass('dt-browser-tab-close-btn')
                .appendTo(config.obj)
                .click(function(event) {
                    var tabs = _this.defaults.tabs;

                    event.stopPropagation();

                    // 当只有一个标签时不允许删除
                    if (tabs.length == 1) { return; }

                    for (var i = 0, len = tabs.length; i < len; ++i) {
                        if (tabs[i].obj.attr('id') == $(this).data('id')) {
                            tabs[i].obj.remove();
                            tabs[i].iframe.remove();

                            tabs[i] = null;

                            tabs.splice(i, 1);

                            _this._swapTabs(tabs[--i || 0].obj.attr('id'));

                            break;
                        }
                    }
                }).data('id', id);


            // 创建标签相关的iframe
            config.iframe = $('<iframe></iframe>').addClass('dt-browser-iframe')
                .css({
                    display : config.openState ? 'block' : 'none'
                })
                .attr({
                    id      : 'dt_browser_tab_iframe_' + (_index++)
                })
                .appendTo(handler.work);

            var dom_iframe = config.iframe.get(0);
            if (config.url) {
                dom_iframe.src = config.url;
            } else {
                config.iframe.load(function() {
                    this.contentWindow.document.body.innerHTML = config.content;
                });
                dom_iframe.src = DT.pathname + 'blank.html';
                
            }

            // 将GUID写入到iframe页面中
            config.iframe.load(function() {
                this.contentWindow.__GUID__ = options.guid;
            });

            // 修改work样式。
            handler.work.css({
                overflow : 'hidden'
            });

            return this;
        };

        // 设置元素的大小
        this._cs = this._setSize;
        this._setSize = function() {
            var handler = _this.handler;

            this._cs.apply(this);

            // 修正工作区高度
            handler.work.css({
                height : handler.work.height() - DT.TAB_HEIGHT
            });

            $.each(_this.defaults.tabs, function(index, value) {
                value.iframe.css({
                    width   : handler.work.width(),
                    height  : handler.work.height()
                });
            });

            return this;
        };

        // 初始化最大化参数
        var _maxp = this._maxParam;
        this._maxParam = function() {
            _maxp.apply(this);

            return this;
        };

        // 最小化
        var _minh = this._minHandler;
        this._minHandler = function(fn) {
            _minh.apply(this, [fn]);

            return this;
        };

        // 关闭
        this._closeHandler = function(fn) {
            // 先最小化窗口，然后再删除元素。
            this._minHandler(function() {
                var tabs    = _this.defaults.tabs,
                    handler = _this.handler;

                $.each(tabs, function(index, value) {
                    value.obj.children().remove();
                    value.obj.remove();
                    value.iframe.remove();

                    value.obj    = null;
                    value.iframe = null;
                });

                for (var p in handler) {
                    p !== 'box' && handler[p] && handler[p].remove && handler[p].remove() && (handler[p] = null);
                }

                handler.box.remove();

                handler.box = null;

                var taskbar = DT.moduleManager.getHandler(options.guid, 'taskbar');

                if (taskbar) {
                    taskbar.delIcon(options.guid);
                    DT.moduleManager.setHandler(options.guid, 'taskbar', null);
                }

                $.type(fn) == 'function' && fn();

                DT.moduleManager.remove(options.guid);
            });

            return this;
        };

        /**
         * 创建新建标签按钮
         */
        this._createNewTabButton = function() {
            var handler = _this.handler;

            handler.newTabButton = $('<div></div>').addClass('dt-browser-tab-new-button')
                .appendTo(handler.tabsContainer)
                .css({
                    display : options.allowCreateTab ? 'block' : 'none'
                })
                .click(function() {
                    _this.newTab($.extend({}, _this.defaults.defaultTabConfig));
                });

            return this;
        };

        /**
         * 切换标签
         * @param {String|Object} p 查找依据，若是string类型即按id来查找，object类型则按dom对象。
         */
        this._swapTabs = function(p) {
            var handler = _this.handler,
                tabs    = _this.defaults.tabs,
                current = handler.currentTab;

            if (current && (current == p || current.obj.attr('id') == p)) {
                return this;
            }

            // 重置当前选中的标签
            $.each(tabs, function(index, value) {
                var obj = value.obj;

                if (obj.attr('id') === p || value == p) {
                    obj.addClass('dt-browser-tab-current');
                    value.iframe.css({ display : 'block' });

                    value.openState    = true;

                    if (current) {
                        current.openState = false;
                        current.obj.removeClass('dt-browser-tab-current')
                        current.iframe.css({ display : 'none'});
                    }
                    handler.currentTab = value;
                }
            });

            return this;
        };

        // 若没有传入标签，则默认创建一个空标签。
        !this.defaults.tabs.length && this.defaults.tabs.push(options.defaultTabConfig);
    };


    var F = function() {};

    F.prototype = DT.Window.prototype;

    DT.Browser.prototype = new F();
    DT.Browser.constructor = DT.Browser;

    var bp = DT.Browser.prototype;

    // 渲染器
    bp.render = function() {
        this._createFrame();

        // 初始化所有的tab
        var tabs = this.defaults.tabs;

        for (var i = 0, len = tabs.length; i < len; ++i) {
            this._createTab(tabs[i]);
            tabs[i].openState && this._swapTabs(tabs[i]);
        }

        this._setSize().top();

        return this;
    };

    /**
     * 新建标签
     * @param {Object}  config 标签属性，执行完此方法后，config被扩展了两个对象，obj（标签对象）与iframe（工作区对象）
     * @return {Object} 返回创建后的对象
     */
    bp.newTab = function(config) {
        config = $.extend({}, this.defaults.defaultTabConfig, config);

        this.defaults.tabs.push(config);
        this._createTab(config)._setSize();

        return config.obj;
    };

    /**
     * 切换标签
     */
    bp.swapTab = function(tab) {
        this._swapTabs(tab);

        return this;
    }

})(jQuery);